package com.study.lu;

import java.util.Arrays;

public class 三数相乘 {
    /**
     * 给定一个数组，长度大于等于3，数组中都是整数，求出三个数相乘最大值
     * 题解：
     * 1.如果全是正整数，那么三个最大数相乘即最大
     * 2.如果全是负数，那么也是三个最大数相乘即最大
     * 3.如果有正有负数。
     * 3.a。一个负数的情况下。如果数组长度等于3，那么只能是这三个数相乘。如果长度大于3，那么就跟第一种情况一样，
     * 3.b。如果有两个负数或者跟多，由于存在负负得正，那么就存在两种情况。两个最小的负数*一个最大数  跟 三个最大数相乘做比较
     *
     * @param args
     */
    public static void main(String[] args) {

        int[] numbers = new int[]{1, 2, 3, 4, 5, -9, -8};

        System.out.println(bf(numbers));

        System.out.println(xianXing(numbers));

    }

    private static int xianXing(int[] numbers) {
        int min1 = Integer.MAX_VALUE, min2 = min1;
        int max1 = Integer.MIN_VALUE, max2 = max1, max3 = max2;
        for (int number : numbers) {
            // 如果这个数比最小的数还小，那么他应该是最小数
            if (number <= min1) {
                // 第一小变成了第二小
                min2 = min1;
                // 第一小
                min1 = number;
            } else if (number < min2) {
                min2 = number;
            }

            if (number >= max1) {
                max3 = max2;
                max2 = max1;
                max1 = number;
            } else if (number >= max2) {
                max3 = max2;
                max2 = number;
            } else if (number > max3) {
                max3 = number;
            }
        }

        return Math.max(min1 * min2 * max1,
                max1 * max2 * max3);
    }

    private static int bf(int[] numbers) {
        Arrays.sort(numbers);
        return Math.max(numbers[0] * numbers[1] * numbers[numbers.length - 1],
                numbers[numbers.length - 3] * numbers[numbers.length - 2] * numbers[numbers.length - 1]);
    }
}
